home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / trueSpace 7.6 / tS761B8Std.exe / {app} / Scripts / D3D / RsD3DMaterialFromME_Template_Fallback.fx < prev    next >
Text File  |  2008-06-10  |  26KB  |  739 lines

  1.  
  2. #line 3 "MainD3DShaderTemplate"
  3.  
  4. //------------------------------
  5. //Fallback parameters start here
  6. //------------------------------
  7.  
  8. //Diffuse color parameters
  9. //Final diffuse color is computed using this equation
  10. //DiffuseColor = VertexColor * ps11fal_VertexColorMod + ps11fal_DiffuseColor + ps11fal_DiffuseMapMod * ps11fal_DiffuseMap
  11. texture ps11fal_DiffuseMap      : RsD3Dps11Fal_DiffuseMap;
  12. float4  ps11fal_DiffuseColor    : RsD3Dps11Fal_DiffuseColor     = float4(0.0, 0.0, 0.0, 0.0);
  13. float4  ps11fal_DiffuseMapMod   : RsD3Dps11Fal_DiffuseMapMod    = float4(0.0, 0.0, 0.0, 0.0);
  14. float4  ps11fal_VertexColorMod  : RsD3Dps11Fal_VertexColorMod   = float4(0.7, 0.7, 0.7, 1.0);
  15.  
  16. texture ps11fal_NormalMap       : RsD3Dps11Fal_NormalMap;
  17. float4  ps11fal_SpecularColor   : RsD3Dps11Fal_SpecularColor    = float4(1.0, 1.0, 1.0, 1.0);
  18. float   ps11fal_Shininess       : RsD3Dps11Fal_Shininess        = 20.0;
  19. //float4 ps11fal_ : RsD3Dps11Fal_;
  20.  
  21. //------------------------------
  22. //The default light processing
  23. //
  24. //ps11fal_LightToggle is used to toggle between directional or positional light.
  25. //It is actually used in LERP between real light_to_point vector and ps11fal_LightDir
  26. //if ps11fal_LightToggle == 1 then only ps11fal_LightDir is used.
  27. //
  28. //Light attenuation is computed as saturate(1 / (Att.x * dist^2 + Att.y * dist + Att.z))
  29. //Att = ps11fal_LightAtten;
  30. //Attenuation start is added to the equation by modification of the distance vector
  31. //dist = max(0, real_dist - AttenStart);
  32. float4 ps11fal_LightPos         : RsD3Dps11Fal_LightPosition    = float4(0.0, 0.0, 0.0, 1.0);
  33. float3 ps11fal_LightDir         : RsD3Dps11Fal_LightDirection   = float3(0.0, 0.0, 0.0);
  34. float  ps11fal_LightToggle      : RsD3Dps11Fal_LightToggle      = 0.0;
  35. float4 ps11fal_LightColor       : RsD3Dps11Fal_LightColor       = float4(1.0, 1.0, 1.0, 1.0);
  36. float  ps11fal_LightAttenStart  : RsD3Dps11Fal_LightAttenStart  = 0.0;
  37. float3 ps11fal_LightAtten       : RsD3Dps11Fal_LightAtten       = float3(0.0, 0.0, 1.0);
  38.  
  39. //------------------------------
  40. //Texture coordinates processing
  41. //
  42. float  ps11fal_TCScaleX         : RsD3Dps11Fal_TCScaleX         = 1.0;
  43. float  ps11fal_TCScaleY         : RsD3Dps11Fal_TCScaleY         = 1.0;
  44. float  ps11fal_TCMoveX          : RsD3Dps11Fal_TCMoveX          = 0.0;
  45. float  ps11fal_TCMoveY          : RsD3Dps11Fal_TCMoveY          = 0.0;
  46.  
  47. //------------------------------
  48. //PS 1.4 Specular maps
  49. //
  50. texture ps11fal_PS14SpecularMap       : RsD3Dps11Fal_PS14SpecularMap;
  51.  
  52. sampler ps11fal_smplDiffuse = sampler_state {
  53.     Texture = <ps11fal_DiffuseMap>;
  54.  
  55.     MinFilter = LINEAR;
  56.     MagFilter = LINEAR;
  57.     MipFilter = LINEAR;
  58.  
  59.     AddressU = WRAP;
  60.     AddressV = WRAP;
  61. };
  62.  
  63. sampler ps11fal_smplNormal = sampler_state {
  64.     Texture = <ps11fal_NormalMap>;
  65.  
  66.     MinFilter = LINEAR;
  67.     MagFilter = LINEAR;
  68.     MipFilter = LINEAR;
  69.  
  70.     AddressU = WRAP;
  71.     AddressV = WRAP;
  72. };
  73.  
  74. sampler ps11fal_smplSpecular = sampler_state {
  75.     Texture = <ps11fal_PS14SpecularMap>;
  76.  
  77.     MinFilter = LINEAR;
  78.     MagFilter = LINEAR;
  79.     MipFilter = LINEAR;
  80.  
  81.     AddressU = CLAMP;
  82.     AddressV = CLAMP;
  83. };
  84.  
  85. float RsD3DComputeShininess()
  86. {
  87.     return (ps11fal_Shininess<=1.0f) ? 20.0f : ps11fal_Shininess;
  88. }
  89.  
  90. float3x3 RsD3DComputeTangentTransform(float3 vTangent, float3 vNormal, in float3x3 mToWorld) {
  91.     float3x3 mToTangent;
  92.     mToTangent[0] = normalize(mul(vTangent, mToWorld));
  93.     mToTangent[2] = normalize(mul(vNormal, mToWorld));
  94.     mToTangent[1] = cross(mToTangent[0], mToTangent[2]);
  95.     return mToTangent;
  96. }
  97.  
  98. float2 RsD3DComputeTexCoords(float2 vInputCoords) {
  99.     float2 vRetVal = vInputCoords;
  100.     vRetVal.x = vInputCoords.x * ps11fal_TCScaleX + ps11fal_TCMoveX;
  101.     vRetVal.y = vInputCoords.y * ps11fal_TCScaleY + ps11fal_TCMoveY;
  102.     return vRetVal;
  103. }
  104.  
  105. //------------------------------
  106. // This is a fallback code for PS 2.0 hardware
  107. // We do per pixel diffuse and per pixel specular
  108. //------------------------------
  109. struct VS_OUTPUT_PS20 {
  110.     float4 vClipPos     : POSITION;     //Clipping space position
  111.     float2 tcCoord      : TEXCOORD0;    //texture coordinates
  112.     float3 vLight       : TEXCOORD1;    //light vector
  113.     float3 vEye         : TEXCOORD2;    //eye vector
  114.     float4 vDistToLight : TEXCOORD3;    //distance from light
  115.     float4 cVertexColor : TEXCOORD4;    //vertex color
  116. };
  117.  
  118. VS_OUTPUT_PS20 VS_Fallback_ForPS20HW(in D3_VERTEXINPUT input)
  119. {
  120.     VS_OUTPUT_PS20 output;
  121.  
  122.     //Following code outputs position and texture coordinates
  123.     //------------------------------
  124.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  125.     output.tcCoord = RsD3DComputeTexCoords(input.D3_vInputTexCoords1); //Texture coordinates for color texture
  126.  
  127.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  128.     float3x3 mToTangent = RsD3DComputeTangentTransform(input.D3_vInputTangent, input.D3_vInputNormal, D3_mObjectToWorldN);
  129.  
  130.     //Compute light and eye vectors
  131.     //------------------------------
  132.     float3 vToLight = lerp(ps11fal_LightPos.xyz - pVertexWorld.xyz, -ps11fal_LightDir, ps11fal_LightToggle);
  133.     output.vLight = mul(mToTangent, normalize(vToLight));
  134.     float  fRealDistToLight = length(vToLight);
  135.     float fDistToLight = max(0, fRealDistToLight - ps11fal_LightAttenStart);
  136.     output.vDistToLight = fDistToLight;
  137.  
  138.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  139.     output.vEye = mul(mToTangent, vToEye);
  140.  
  141.     output.cVertexColor = input.D3_cInputColor * ps11fal_VertexColorMod + ps11fal_DiffuseColor;
  142.  
  143.     return output;
  144. }
  145.  
  146. float4 PS_Fallback_ForPS20HW(in VS_OUTPUT_PS20 input) : COLOR0
  147. {
  148.     float4 cDecal = tex2D(ps11fal_smplDiffuse, input.tcCoord);
  149.     float3 cNormal = tex2D(ps11fal_smplNormal, input.tcCoord).xyz;
  150.     float3 vNormal = normalize(2.0f * cNormal - 1.0f);    //expand to the range -1,1
  151.     float3 vEye = normalize(input.vEye);
  152.     float3 vLight = normalize(input.vLight);
  153.  
  154.     //Compute final light color with respect to the attenuation
  155.     //------------------------------
  156.     float fDistToLight = input.vDistToLight.w;
  157.     float fAttenuation = ps11fal_LightAtten.x * fDistToLight * fDistToLight + ps11fal_LightAtten.y * fDistToLight + ps11fal_LightAtten.z;
  158.     float4 cLightColor = ps11fal_LightColor * saturate(1.0f / fAttenuation);
  159.  
  160.     float3 vRefVec = dot(vLight, vNormal) * 2 * vNormal - vLight;
  161.     float fEyeDotRef = max(0, dot(vRefVec, vEye));
  162.     float4 cSpecularCol = ps11fal_SpecularColor * pow(fEyeDotRef, RsD3DComputeShininess());
  163.  
  164.     float fDiffuseDot = saturate(dot(vNormal, vLight));
  165.     float4 diffuseColor = input.cVertexColor + ps11fal_DiffuseMapMod * cDecal;
  166.     float4 cOut = cLightColor * (cSpecularCol + diffuseColor * fDiffuseDot);
  167.     cOut.a = diffuseColor.a;
  168.     return cOut;
  169. }
  170.  
  171. technique D3_FALLBACK_TECHNIQUE_PS20
  172. <
  173.     string Rs_PSVersion = "PS_2_0";
  174.     string Rs_TechniqueMode = "firstlight";
  175. >
  176. {
  177.     pass D3_FALLBACK_PASS_02_PS20
  178.     {
  179.         VertexShader = compile vs_2_0 VS_Fallback_ForPS20HW();
  180.         PixelShader = compile ps_2_0 PS_Fallback_ForPS20HW();
  181.  
  182.         AlphaBlendEnable = false;
  183.  
  184.         ZEnable = true;
  185.         ZFunc = LESSEQUAL;
  186.         ZWriteEnable = true;
  187.         
  188.         CullMode = CCW;
  189.     }
  190. }
  191.  
  192. technique D3_FALLBACK_TECHNIQUE_PS20_MORELIGHTS
  193. <
  194.     string Rs_PSVersion = "PS_2_0";
  195.     string Rs_TechniqueMode = "morelights";
  196. >
  197. {
  198.     pass D3_FALLBACK_PASS_02_PS20
  199.     {
  200.         VertexShader = compile vs_2_0 VS_Fallback_ForPS20HW();
  201.         PixelShader = compile ps_2_0 PS_Fallback_ForPS20HW();
  202.  
  203.         AlphaBlendEnable = true;
  204.         SrcBlend = ONE;
  205.         DestBlend = ONE;
  206.  
  207.         ZEnable = true;
  208.         ZFunc = EQUAL;
  209.         ZWriteEnable = false;
  210.         
  211.         CullMode = CCW;
  212.     }
  213. }
  214.  
  215. //------------------------------
  216. // This is a fallback code for PS 1.4 hardware
  217. // We do per pixel diffuse and per pixel specular. Attenuation is computed per vertex.
  218. //------------------------------
  219. struct VS_OUTPUT_PS14 {
  220.     float4 vClipPos     : POSITION;     //Clipping space position
  221.     float2 tcCoord      : TEXCOORD0;    //texture coordinates
  222.     float3 vLight       : TEXCOORD1;    //light vector
  223.     float3 vEye         : TEXCOORD2;    //eye vector
  224.     float4 cLightColor  : COLOR1;       //light color with attenuation
  225.     float4 cVertexColor : COLOR0;       //vertex color
  226. };
  227.  
  228. VS_OUTPUT_PS14 VS_Fallback_ForPS14HW(in D3_VERTEXINPUT input)
  229. {
  230.     VS_OUTPUT_PS14 output;
  231.  
  232.     //Following code outputs position and texture coordinates
  233.     //------------------------------
  234.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  235.     output.tcCoord = RsD3DComputeTexCoords(input.D3_vInputTexCoords1); //Texture coordinates for color texture
  236.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  237.  
  238.     float3x3 mToTangent = RsD3DComputeTangentTransform(input.D3_vInputTangent, input.D3_vInputNormal, D3_mObjectToWorldN);
  239.  
  240.     //Compute light and eye vectors
  241.     //------------------------------
  242.     float3 vToLight = lerp(ps11fal_LightPos.xyz - pVertexWorld.xyz, -ps11fal_LightDir, ps11fal_LightToggle);
  243.     float  fRealDistToLight = length(vToLight);
  244.     vToLight = normalize(vToLight);
  245.  
  246.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  247.  
  248.     //Compute final light color with respect to the attenuation
  249.     //------------------------------
  250.     float fDistToLight = max(0, fRealDistToLight - ps11fal_LightAttenStart);
  251.     float fAttenuation = ps11fal_LightAtten.x * fDistToLight * fDistToLight + ps11fal_LightAtten.y * fDistToLight + ps11fal_LightAtten.z;
  252.     fAttenuation = saturate(1 / fAttenuation);
  253.     output.cLightColor = ps11fal_LightColor * fAttenuation;
  254.  
  255.     //Compute final per vertex color using
  256.     //------------------------------
  257.     output.cVertexColor = input.D3_cInputColor * ps11fal_VertexColorMod + ps11fal_DiffuseColor;
  258.  
  259.     output.vLight = mul(mToTangent, vToLight);
  260.     output.vEye = mul(mToTangent, vToEye);
  261.  
  262.     return output;
  263. }
  264.  
  265. float4 PS_Fallback_ForPS14HW(in VS_OUTPUT_PS14 input) : COLOR0
  266. {
  267.     float4 cDecal = tex2D(ps11fal_smplDiffuse, input.tcCoord);
  268.     float3 cNormal = tex2D(ps11fal_smplNormal, input.tcCoord).xyz;
  269.     float3 vNormal = 2.0f * cNormal - 1.0f;
  270.     float3 vLight = input.vLight;
  271.  
  272.     float fNdotL = dot(vLight, vNormal);
  273.     float4 diffuseColor = input.cVertexColor + ps11fal_DiffuseMapMod * cDecal;
  274.  
  275.     //Specular term
  276.     float3 vEye = input.vEye;
  277.     float3 vRefVec = 2.0f * fNdotL * vNormal - vLight;
  278.     float2 vCoord;
  279.     vCoord.x = dot(vEye, vRefVec);
  280.     vCoord.y = RsD3DComputeShininess() / 100.0f;
  281.     float4 cSpecularTerm = tex2D(ps11fal_smplSpecular, vCoord);
  282.     float4 cSpecularCol = ps11fal_SpecularColor * cSpecularTerm.a;
  283.     
  284.     float4 cOut;
  285.     cOut.rgb = input.cLightColor * (cSpecularCol + diffuseColor * saturate(fNdotL));
  286.     cOut.a = diffuseColor.a;
  287.     return cOut;
  288. }
  289.  
  290. technique D3_FALLBACK_TECHNIQUE_PS14
  291. <
  292.     string Rs_PSVersion = "PS_1_4";
  293.     string Rs_TechniqueMode = "firstlight";
  294. >
  295. {
  296.     pass D3_FALLBACK_PASS_02_PS20
  297.     {
  298.         VertexShader = compile vs_1_1 VS_Fallback_ForPS14HW();
  299.         PixelShader = compile ps_1_4 PS_Fallback_ForPS14HW();
  300.  
  301.         AlphaBlendEnable = false;
  302.         ZEnable = true;
  303.         ZFunc = LESSEQUAL;
  304.         ZWriteEnable = true;
  305.  
  306.         CullMode = CCW;
  307.     }
  308. }
  309.  
  310. technique D3_FALLBACK_TECHNIQUE_PS14_MORELIGHT
  311. <
  312.     string Rs_PSVersion = "PS_1_4";
  313.     string Rs_TechniqueMode = "morelights";
  314. >
  315. {
  316.     pass D3_FALLBACK_PASS_02_PS20
  317.     {
  318.         VertexShader = compile vs_1_1 VS_Fallback_ForPS14HW();
  319.         PixelShader = compile ps_1_4 PS_Fallback_ForPS14HW();
  320.  
  321.         AlphaBlendEnable = true;
  322.         SrcBlend = ONE;
  323.         DestBlend = ONE;
  324.  
  325.         ZEnable = true;
  326.         ZFunc = EQUAL;
  327.         ZWriteEnable = false;
  328.  
  329.         CullMode = CCW;
  330.     }
  331. }
  332.  
  333. //------------------------------
  334. // This is a fallback code for PS 1.1 hardware
  335. // We do per pixel diffuse and per vertex specular
  336. //------------------------------
  337. struct VS_OUTPUT_PS11 {
  338.     float4 vClipPos     : POSITION; //Clipping space position
  339.     float4 cVertexColor : COLOR0;   //vertex color
  340.     float4 cLightColor  : COLOR1;   //light color with attenuation
  341.     float2 tcCoord0     : TEXCOORD0;//texture coordinates
  342.     float2 tcCoord1     : TEXCOORD1;//texture coordinates
  343.     float3 vLight       : TEXCOORD2;//light vector
  344.     float4 cSpecularCol : TEXCOORD3;//complete specular color component
  345. };
  346.  
  347. VS_OUTPUT_PS11 VS_Fallback_ForPS11HW(in D3_VERTEXINPUT input)
  348. {
  349.     VS_OUTPUT_PS11 output;
  350.  
  351.     //Following code outputs position and texture coordinates
  352.     //------------------------------
  353.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  354.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  355.  
  356.     float3x3 mToTangent = RsD3DComputeTangentTransform(input.D3_vInputTangent, input.D3_vInputNormal, D3_mObjectToWorldN);
  357.  
  358.     //Compute light and eye vectors
  359.     //------------------------------
  360.     float3 vToLight = lerp(ps11fal_LightPos.xyz - pVertexWorld.xyz, -ps11fal_LightDir, ps11fal_LightToggle);
  361.     float  fRealDistToLight = length(vToLight);
  362.     vToLight = normalize(vToLight);
  363.  
  364.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  365.  
  366.     //Compute final light color with respect to the attenuation
  367.     //------------------------------
  368.     float fDistToLight = max(0, fRealDistToLight - ps11fal_LightAttenStart);
  369.     float fAttenuation = ps11fal_LightAtten.x * fDistToLight * fDistToLight + ps11fal_LightAtten.y * fDistToLight + ps11fal_LightAtten.z;
  370.     fAttenuation = saturate(1 / fAttenuation);
  371.     output.cLightColor = ps11fal_LightColor * fAttenuation;
  372.  
  373.     //Compute final per vertex color using
  374.     //------------------------------
  375.     float3 vRefVec = dot(vToLight, mToTangent[2]) * 2 * mToTangent[2] - vToLight;
  376.     float fEyeDotRef = max(0, dot(vRefVec, vToEye));
  377.  
  378.     output.tcCoord0 = RsD3DComputeTexCoords(input.D3_vInputTexCoords1); //Texture coordinates for color texture
  379.     output.tcCoord1 = output.tcCoord0;                                 //Texture coordinates for normal texture
  380.  
  381.     output.cSpecularCol = output.cLightColor * ps11fal_SpecularColor * pow(fEyeDotRef, RsD3DComputeShininess());
  382.     output.cVertexColor = input.D3_cInputColor * ps11fal_VertexColorMod + ps11fal_DiffuseColor;
  383.  
  384.     output.vLight = mul(mToTangent, vToLight);
  385.     output.vLight = 0.5 * output.vLight + 0.5;
  386.  
  387.     return output;
  388. }
  389.  
  390. float4 PS_Fallback_ForPS11HW(in VS_OUTPUT_PS11 input) : COLOR0
  391. {
  392.     float4 cDecal = tex2D(ps11fal_smplDiffuse, input.tcCoord0);
  393.     float3 cNormal = tex2D(ps11fal_smplNormal, input.tcCoord1).xyz;
  394.     float3 vNormal = 2.0f * cNormal - 1.0f;    //expand to the range -1,1
  395.     float3 vLight = 2.0f * input.vLight - 1.0f;    //expand to the range -1,1
  396.     float fDiffuseDot = saturate(dot(vNormal, vLight));
  397.     float4 diffuseColor = input.cVertexColor + ps11fal_DiffuseMapMod * cDecal;
  398.     float4 cOut = input.cSpecularCol + input.cLightColor * diffuseColor * fDiffuseDot;
  399.     cOut.a = diffuseColor.a;
  400.     return cOut;
  401. }
  402.  
  403. technique D3_FALLBACK_TECHNIQUE_PS11
  404. <
  405.     string Rs_PSVersion = "PS_1_1";
  406.     string Rs_TechniqueMode = "firstlight";
  407. >
  408. {
  409.     pass D3_FALLBACK_PASS_02_PS11
  410.     {
  411.         VertexShader = compile vs_1_1 VS_Fallback_ForPS11HW();
  412.         PixelShader = compile ps_1_1 PS_Fallback_ForPS11HW();
  413.  
  414.         AlphaBlendEnable = false;
  415.         ZEnable = true;
  416.         ZFunc = LESSEQUAL;
  417.         ZWriteEnable = true;
  418.  
  419.         CullMode = CCW;
  420.     }
  421. }
  422.  
  423. technique D3_FALLBACK_TECHNIQUE_PS11_MORELIGHT
  424. <
  425.     string Rs_PSVersion = "PS_1_1";
  426.     string Rs_TechniqueMode = "morelights";
  427. >
  428. {
  429.     pass D3_FALLBACK_PASS_02_PS11
  430.     {
  431.         VertexShader = compile vs_1_1 VS_Fallback_ForPS11HW();
  432.         PixelShader = compile ps_1_1 PS_Fallback_ForPS11HW();
  433.  
  434.         AlphaBlendEnable = true;
  435.  
  436.         SrcBlend = ONE;
  437.         DestBlend = ONE;
  438.  
  439.         ZEnable = true;
  440.         ZFunc = EQUAL;
  441.         ZWriteEnable = false;
  442.  
  443.         CullMode = CCW;
  444.     }
  445. }
  446.  
  447. //------------------------------
  448. // This is a fallback code for old DX7 hardware with the DOT3 capabilities
  449. // Specular is computed per vertex, diffuse is computed per pixel
  450. //------------------------------
  451. //TODO: Here comes the DOT3 technique
  452.  
  453. //------------------------------
  454. // This is a fallback code for old DX7 hardware even without DOT3 capabilities
  455. // Entire lighting is computed per vertex and diffuse texture is used.
  456. //------------------------------
  457. struct VS_OUTPUT_SIMPLE_DX7 {
  458.     float4 vClipPos: POSITION;      //Clipping space position
  459.     float2 tcCoord0: TEXCOORD0;     //Texture coordinates
  460.     float4 cColor0 : COLOR0;        //diffuse map mod
  461.     float4 cColor1 : COLOR1;        //specular color + diffuse color mod
  462. };
  463.  
  464. VS_OUTPUT_SIMPLE_DX7 VS_Fallback_Simple_DX7(in D3_VERTEXINPUT input) {
  465.     VS_OUTPUT_SIMPLE_DX7 output;
  466.  
  467.     //Following code outputs position and texture coordinates
  468.     //------------------------------
  469.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  470.     output.tcCoord0 = RsD3DComputeTexCoords(input.D3_vInputTexCoords1); //Texture coordinates for color texture
  471.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  472.  
  473.     //Compute light and eye vectors
  474.     //------------------------------
  475.     float3 vToLight = lerp(ps11fal_LightPos.xyz - pVertexWorld.xyz, -ps11fal_LightDir, ps11fal_LightToggle);
  476.     float  fRealDistToLight = length(vToLight);
  477.     vToLight = normalize(vToLight);
  478.  
  479.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  480.  
  481.     //Compute final light color with respect to the attenuation
  482.     //------------------------------
  483.     float fDistToLight = max(0, fRealDistToLight - ps11fal_LightAttenStart);
  484.     float fAttenuation = ps11fal_LightAtten.x * fDistToLight * fDistToLight + ps11fal_LightAtten.y * fDistToLight + ps11fal_LightAtten.z;
  485.     fAttenuation = saturate(1 / fAttenuation);
  486.     float4 output_cLightColor = ps11fal_LightColor * fAttenuation;
  487.  
  488.     //Compute final per vertex color using light/specular/diffuse
  489.     //------------------------------
  490.     float3 vNormal = normalize(mul(input.D3_vInputNormal, D3_mObjectToWorldN));
  491.     float3 vRefVec = dot(vToLight, vNormal) * 2 * vNormal - vToLight;
  492.     float fEyeDotRef = max(0, dot(vRefVec, vToEye));
  493.  
  494.     float4 output_cSpecularCol = ps11fal_SpecularColor * pow(fEyeDotRef, RsD3DComputeShininess());
  495.     float4 output_cVertexColor = input.D3_cInputColor * ps11fal_VertexColorMod + ps11fal_DiffuseColor;
  496.  
  497.     float fDiffuseDot = saturate(dot(vNormal, vToLight));
  498.     output.cColor0.xyz = saturate(output_cLightColor * ps11fal_DiffuseMapMod * fDiffuseDot);
  499.     output.cColor0.a = 1.0f;
  500.  
  501.     output.cColor1.xyz = saturate(output_cLightColor * (output_cSpecularCol + (output_cVertexColor * fDiffuseDot)));
  502.     output.cColor1.a = 1.0f;
  503.     return output;
  504. }
  505.  
  506. //The Dx7 without explicit texture cascade
  507. technique D3_FALLBACK_TECHNIQUE_DX7_NOMADD
  508. <
  509.     string Rs_PSVersion = "PS_NONE";
  510.     string Rs_TechniqueMode = "firstlight";
  511. >
  512. {
  513.     pass D3_FALLBACK_PASS_02
  514.     {
  515.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7();
  516.         PixelShader = NULL;
  517.  
  518.         AlphaBlendEnable = false;
  519.         ZEnable = true;
  520.         ZFunc = LESSEQUAL;
  521.         ZWriteEnable = true;
  522.         
  523.         // Set texture filtering.
  524.         MinFilter[0] = Linear;
  525.         MagFilter[0] = Linear;
  526.         MipFilter[0] = Point;
  527.  
  528.         // Set texture into stage 0.
  529.         Texture[0]   = (ps11fal_DiffuseMap);
  530.  
  531.         SpecularEnable = true;
  532.         ColorVertex = true;        
  533.         Lighting = false;
  534.         ShadeMode = GOURAUD;
  535.  
  536.         CullMode = CCW;
  537.     }
  538. }
  539.  
  540. technique D3_FALLBACK_TECHNIQUE_DX7_NOMADD_MORELIGHTS
  541. <
  542.     string Rs_PSVersion = "PS_NONE";
  543.     string Rs_TechniqueMode = "morelights";
  544. >
  545. {
  546.     pass D3_FALLBACK_PASS_02
  547.     {
  548.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7();
  549.         PixelShader = NULL;
  550.  
  551.         AlphaBlendEnable = true;
  552.  
  553.         SrcBlend = ONE;
  554.         DestBlend = ONE;
  555.  
  556.         ZEnable = true;
  557.         ZFunc = EQUAL;
  558.         ZWriteEnable = false;
  559.         
  560.         // Set texture filtering.
  561.         MinFilter[0] = Linear;
  562.         MagFilter[0] = Linear;
  563.         MipFilter[0] = Point;
  564.  
  565.         // Set texture into stage 0.
  566.         Texture[0]   = (ps11fal_DiffuseMap);
  567.  
  568.         SpecularEnable = true;
  569.         ColorVertex = true;        
  570.         Lighting = false;
  571.         ShadeMode = GOURAUD;
  572.  
  573.         CullMode = CCW;
  574.     }
  575. }
  576.  
  577. struct VS_OUTPUT_SIMPLE_DX7_NOTEX {
  578.     float4 vClipPos: POSITION;      //Clipping space position
  579.     float4 cColor0 : COLOR0;        //diffuse map mod
  580. };
  581.  
  582. VS_OUTPUT_SIMPLE_DX7_NOTEX VS_Fallback_Simple_DX7NOTEX(in D3_VERTEXINPUT input) {
  583.     VS_OUTPUT_SIMPLE_DX7_NOTEX output;
  584.  
  585.     //Following code outputs position and texture coordinates
  586.     //------------------------------
  587.     output.vClipPos = mul(input.D3_pInputPosition, D3_mObjectToClip); //vertex clip position
  588.     float4 pVertexWorld = mul(input.D3_pInputPosition, D3_mObjectToWorld);    //Transform vertex into world position
  589.  
  590.     //Compute light and eye vectors
  591.     //------------------------------
  592.     float3 vToLight = lerp(ps11fal_LightPos.xyz - pVertexWorld.xyz, -ps11fal_LightDir, ps11fal_LightToggle);
  593.     float  fRealDistToLight = length(vToLight);
  594.     vToLight = normalize(vToLight);
  595.  
  596.     float3 vToEye = normalize(D3_pEye - pVertexWorld);
  597.  
  598.     //Compute final light color with respect to the attenuation
  599.     //------------------------------
  600.     float fDistToLight = max(0, fRealDistToLight - ps11fal_LightAttenStart);
  601.     float fAttenuation = ps11fal_LightAtten.x * fDistToLight * fDistToLight + ps11fal_LightAtten.y * fDistToLight + ps11fal_LightAtten.z;
  602.     fAttenuation = saturate(1 / fAttenuation);
  603.     float4 output_cLightColor = ps11fal_LightColor * fAttenuation;
  604.  
  605.     //Compute final per vertex color using light/specular/diffuse
  606.     //------------------------------
  607.     float3 vNormal = normalize(mul(input.D3_vInputNormal, D3_mObjectToWorldN));
  608.     float3 vRefVec = dot(vToLight, vNormal) * 2 * vNormal - vToLight;
  609.     float fEyeDotRef = max(0, dot(vRefVec, vToEye));
  610.  
  611.     float4 output_cSpecularCol = ps11fal_SpecularColor * pow(fEyeDotRef, RsD3DComputeShininess());
  612.     float4 output_cVertexColor = input.D3_cInputColor * ps11fal_VertexColorMod + ps11fal_DiffuseColor;
  613.  
  614.     float fDiffuseDot = saturate(dot(vNormal, vToLight));
  615.     float4 vOutFinal0 = saturate(output_cLightColor * ps11fal_DiffuseMapMod * fDiffuseDot);
  616.  
  617.     float4 vOutFinal1 = saturate(output_cLightColor * (output_cSpecularCol + (output_cVertexColor * fDiffuseDot)));
  618.     output.cColor0.xyz = vOutFinal0 + vOutFinal1;
  619.     output.cColor0.a = 1.0f;
  620.     return output;
  621. }
  622.  
  623. //DX7 technique for HW without textures - all per vertex
  624. technique D3_FALLBACK_TECHNIQUE_DX7
  625. <
  626.     string Rs_PSVersion = "PS_NONE";
  627.     string Rs_TechniqueMode = "firstlight";
  628. >
  629. {
  630.     pass D3_FALLBACK_PASS_02
  631.     {
  632.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7NOTEX();
  633.         PixelShader = NULL;
  634.  
  635.         AlphaBlendEnable = false;
  636.  
  637.         ZEnable = true;
  638.         ZFunc = LESSEQUAL;
  639.         ZWriteEnable = true;
  640.         
  641.         Lighting = false;
  642.         ShadeMode = GOURAUD;
  643.  
  644.         CullMode = CCW;
  645.     }
  646. }
  647.  
  648. technique D3_FALLBACK_TECHNIQUE_DX7_MORELIGHTS
  649. <
  650.     string Rs_PSVersion = "PS_NONE";
  651.     string Rs_TechniqueMode = "morelights";
  652. >
  653. {
  654.     pass D3_FALLBACK_PASS_02
  655.     {
  656.         VertexShader = compile vs_1_1 VS_Fallback_Simple_DX7NOTEX();
  657.         PixelShader = NULL;
  658.  
  659.         AlphaBlendEnable = true;
  660.  
  661.         SrcBlend = ONE;
  662.         DestBlend = ONE;
  663.  
  664.         ZEnable = true;
  665.         ZFunc = EQUAL;
  666.         ZWriteEnable = false;
  667.         
  668.         Lighting = false;
  669.         ShadeMode = GOURAUD;
  670.  
  671.         CullMode = CCW;
  672.     }
  673. }
  674.  
  675. //------------------------------
  676. // This is a fallback code for absolutely weird hardware
  677. // No texture, just vertex colors
  678. //------------------------------
  679. struct VS_OUTPUT_SIMPLE {
  680.     float4 vClipPos: POSITION;  //Clipping space position
  681.     float4 cColor  : COLOR;     //vertex color
  682. };
  683.  
  684. VS_OUTPUT_SIMPLE VS_Fallback_Simple(float4 vPosition : POSITION, float3 vNormal : NORMAL, float4 cColor : COLOR) {
  685.     VS_OUTPUT_SIMPLE output;
  686.  
  687.     output.vClipPos = mul(vPosition, D3_mObjectToClip);         //vertex clip position
  688.     float4 pVertexWorld = mul(vPosition, D3_mObjectToWorld);    //Transform vertex into world position
  689.  
  690.     float3 vLight = normalize(D3_pEye - pVertexWorld);
  691.     vNormal = normalize(mul(vNormal, D3_mObjectToWorldN));
  692.  
  693.     float Diffuse = saturate(dot(vNormal, vLight));
  694.     output.cColor = cColor * Diffuse;
  695.     return output;
  696. }
  697.  
  698. technique D3_FALLBACK_TECHNIQUE
  699. <
  700.     string Rs_PSVersion = "PS_NONE";
  701.     string Rs_TechniqueMode = "firstlight";
  702. >
  703. {
  704.     pass D3_FALLBACK_PASS_02
  705.     {
  706.         VertexShader = compile vs_1_1 VS_Fallback_Simple();
  707.         PixelShader = NULL;
  708.  
  709.         AlphaBlendEnable = false;
  710.  
  711.         ZEnable = true;
  712.         ZFunc = LESSEQUAL;
  713.         ZWriteEnable = true;
  714.  
  715.         CullMode = CCW;
  716.     }
  717. }
  718.  
  719. technique D3_FALLBACK_TECHNIQUE_MORELIGHT
  720. <
  721.     string Rs_PSVersion = "PS_NONE";
  722.     string Rs_TechniqueMode = "morelights";
  723. >
  724. {
  725.     pass D3_FALLBACK_PASS_02
  726.     {
  727.         VertexShader = compile vs_1_1 VS_Fallback_Simple();
  728.         PixelShader = NULL;
  729.  
  730.         AlphaBlendEnable = false;
  731.  
  732.         ZEnable = true;
  733.         ZFunc = NEVER;
  734.         ZWriteEnable = false;
  735.  
  736.         CullMode = CCW;
  737.     }
  738. }
  739.